package main 

import (
	"fmt"
	"sync"
)

// var wg sync.WaitGroup

// func hello() {
//     defer wg.Done()
//     fmt.Println("Hello Goroutine!")
// }
// func main() {
//     wg.Add(1)
//     go hello() // 启动另外一个goroutine去执行hello函数
//     fmt.Println("main goroutine done!")
//     wg.Wait()
// }

var (
	instance *Singleton
	once	 sync.Once
)

type Singleton struct {
	data string 
}

func GetInstance() *Singleton {
	once.Do(func() {
		instance = &Singleton{data: "单例数据"}
		fmt.Println("创建单例实例")
	})
	return instance
}

func main() {
    // 多次调用，但只创建一次
    s1 := GetInstance()
    s2 := GetInstance()
    s3 := GetInstance()
    
    fmt.Printf("s1: %p\n", s1)
    fmt.Printf("s2: %p\n", s2)
    fmt.Printf("s3: %p\n", s3)
}

